package com.ml.mall.service.variant.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ml.mall.bean.vo.variant.SysProductVariantSalesVo;
import com.ml.mall.consts.CommonConsts;
import com.ml.mall.entity.variant.SysProductVariantSales;
import com.ml.mall.enums.CommonEnum;
import com.ml.mall.enums.SysSeqNameEnum;
import com.ml.mall.exception.BizException;
import com.ml.mall.mapper.variant.SysProductVariantSalesMapper;
import com.ml.mall.service.common.CommonSeqService;
import com.ml.mall.service.variant.SysProductVariantSalesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author kyyang
 * Created 2021-05-19
 */
@Service
public class SysProductVariantSalesServiceImpl extends ServiceImpl<SysProductVariantSalesMapper, SysProductVariantSales> implements SysProductVariantSalesService {

    @Autowired
    private SysProductVariantSalesMapper sysProductVariantSalesMapper;

    @Autowired
    private CommonSeqService commonSeqService;

    @Override
    public BigDecimal getCurPromoByVariantId(Long variantId) {

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String now = sdf.format(date);
        QueryWrapper<SysProductVariantSales> w2 = new QueryWrapper<>();
//         w2.ge("effect_dt",now);
//         w2.lt("expiry_dt",now);
//         w2.ge("begin_time",now);
//         w2.le("end_time",now);
        // 时间的大小判断弄反了
        w2.eq("variant_id", variantId);
        w2.eq("expiry_dt",new Date(CommonConsts.MAX_EXPIRY_TIME));
        w2.le("begin_time", now);
        w2.ge("end_time", now);
        w2.eq("state",1);
        SysProductVariantSales sysProductVariantSales = sysProductVariantSalesMapper.selectOne(w2);
        if (sysProductVariantSales != null) {
            return sysProductVariantSales.getPrice();
        }

        return null;
    }

    @Override
    public void saveSysProductVariantSales(SysProductVariantSalesVo sysProductVariantSalesVo, Long promoid, Long variantId, Integer vid){
        SysProductVariantSales sales=null;
        if(null != variantId && 0L != variantId){
            sales=sysProductVariantSalesMapper.selectMaxVid(variantId);
        }
        if(null != sales){
            vid=sales.getVerId()+1;
            promoid=sales.getPromoId();
        }
        SysProductVariantSales sysProductVariantSales= new SysProductVariantSales();
        BeanUtils.copyProperties(sysProductVariantSalesVo,sysProductVariantSales);
        sysProductVariantSales.setPrice(sysProductVariantSalesVo.getSellPrice());
        //sysProductVariantSales.setSalesName(sysProductVariantSalesVo.getSalesName());
        sysProductVariantSales.setEffectDt(new Date());
        sysProductVariantSales.setExpiryDt(new Date(CommonConsts.MAX_EXPIRY_TIME));
        sysProductVariantSales.setVerId(vid);
        sysProductVariantSales.setState(1);
        Long pid = promoid;
        if(promoid == null){
            pid = commonSeqService.nextSysOrderSeq(SysSeqNameEnum.SEQ_PROMO_ID.getCode(),7);
        }
        sysProductVariantSales.setPromoId(pid);
        sysProductVariantSales.setVariantId(variantId);
        sysProductVariantSales.setId(null);
        boolean b = checkSales(sysProductVariantSalesVo);
        if(b){
            sysProductVariantSalesMapper.insert(sysProductVariantSales);
        }
    }

    @Override
    public Boolean checkSales(SysProductVariantSalesVo sysProductVariantSales) {
        Boolean flag=true;
        int i=0;
        if(null == sysProductVariantSales.getSalesName() || "".equals(sysProductVariantSales.getSalesName())){
            flag=false;
            i+=1;
        }
        if(null == sysProductVariantSales.getSellPrice() || "".equals(sysProductVariantSales.getSellPrice())){
            flag=false;
            i+=1;
        }
        if(null == sysProductVariantSales.getBeginTime() || "".equals(sysProductVariantSales.getBeginTime())){
            flag=false;
            i+=1;
        }
        if(null == sysProductVariantSales.getEndTime() || "".equals(sysProductVariantSales.getEndTime())){
            flag=false;
            i+=1;
        }
        if(i > 0 && i < 4){
            throw new BizException(CommonEnum.ILLEGAL_REQ_ERROR);
        }

        return flag;
    }

    @Override
    public Boolean checkSalesByUpdate(SysProductVariantSalesVo sysProductVariantSales) {
        QueryWrapper<SysProductVariantSales> variantSalesQueryWrapper=new QueryWrapper<SysProductVariantSales>()
                .eq("id",sysProductVariantSales.getId())
                .eq("expiry_dt",new Date(CommonConsts.MAX_EXPIRY_TIME));
        SysProductVariantSales variantSales = sysProductVariantSalesMapper.selectOne(variantSalesQueryWrapper);
        Boolean flag=false;
        //检测价格是否变动
        if(null ==sysProductVariantSales.getSellPrice() || variantSales.getPrice().compareTo(sysProductVariantSales.getSellPrice()) != 0){
            flag=true;
        }
        //检测开始时间是否变动
        if(null ==sysProductVariantSales.getBeginTime() || !variantSales.getBeginTime().equals(sysProductVariantSales.getBeginTime())){
            flag=true;
        }
        //检测结束时间是否变动
        if(null ==sysProductVariantSales.getEndTime() || !variantSales.getEndTime().equals(sysProductVariantSales.getEndTime())){
            flag=true;
        }
        //还有需要检测的可以继续加

        return flag;
    }
}
